package spa.persistencia;

import java.util.List;
import javax.persistence.EntityManager;
import org.hibernate.Criteria;
import org.hibernate.Session;

/**
 *
 * @author Valdi Geraldo - valdi.ads@gmail.com
 */
public class GenericoDAO<T, E> {

    protected Class<T> clazz;

    public GenericoDAO(Class<T> c){
        clazz = c;
    }

    public void salvar(T entidade){
        EntityManager em = ConnectionFactory.getEntityManager();
        em.getTransaction().begin();

        em.persist(entidade);
        em.getTransaction().commit();
        em.close();
    }

    public void atualizar(T entidade){
        EntityManager em = ConnectionFactory.getEntityManager();
        em.getTransaction().begin();

        em.merge(entidade);
        em.getTransaction().commit();
        em.close();
    }

    public void deletar(T entidade){
        EntityManager em = ConnectionFactory.getEntityManager();
        em.getTransaction().begin();

        em.remove(entidade);
        em.getTransaction().commit();
        em.close();
    }

    public List<T> listar(){
        EntityManager em = ConnectionFactory.getEntityManager();
        em.getTransaction().begin();

        // Obtendo a sessão com o banco atraves do Hibernate
        Session session = (Session) em.getDelegate();
        // Criando a CRITERIA passando o literal de classe
        Criteria criteria = session.createCriteria(clazz);
        List<T> lista = criteria.list();
        em.close();
        return lista;
    }
    public T buscarPorId(E id){
        EntityManager em = ConnectionFactory.getEntityManager();
        T entidade = em.find(clazz,id);
        em.close();
        return entidade;
    }
}
